package com.atguigu.juc.collection;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

public class ListTest {

    public static void main(String[] args) {
        List<String> list =
                // new ArrayList<>(); 非同步容器并发读写：java.util.ConcurrentModificationException
                // new Vector<>(); 同步容器并发读写：不会抛异常。因为读、写操作都加了同步锁。但是效率会很低。
                // Collections.synchronizedList(new ArrayList<>()); 同样也是一个同步容器
                new CopyOnWriteArrayList<>(); // 并发容器并发读写：不会抛异常，而且性能大大优于同步容器。所使用的技术：写时复制

        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                // Lambda 表达式的本质是内部类，内部类使用外部类变量时要求是 final 或同等效果
                final int index = j;
                new Thread(() -> {
                    System.out.println(Thread.currentThread().getName() + " j = " + index);
                    String data = UUID.randomUUID().toString().substring(0, 5).toUpperCase();

                    // 写操作
                    list.add(data);

                    // 读操作
                    System.out.println("list = " + list);
                }).start();
            }
        }
    }

}
